Windows Sockets - nekolik otazek

Otázka od: Jakub Cermak

5. 11. 2004 17:44

Mam nekolik otazek z %sub%:
1. Existuje neco jako "timeoutovana" fce recv() (pro TCP spojeni)? Proste
aby po uplynuti urcite doby skoncila i kdyz neprijdou zadna data.
2. Jak se pracuje s UDP sockety? Zkousel jsem poslat data z 1 UDP socketu na
2. a system hlasil odeslani ale nic se neprijalo.
Zdroj prijemce (je to v threadu):procedure TUDPServerThread.Execute();
var s:integer;
  addr:sockaddr_in;
    buf:pchar;
    recv_size:integer;
const buflen=1000;
begin
   s:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  if s = -1 then
   LastErrorToODS; // Neco jako RaiseLastOSError, akorat nedela vyjimku a
chybu vypise pres Output debug string
  addr.sin_family:=AF_INET;
  addr.sin_port:=SwapEndianWord(666);
  addr.sin_addr.S_addr:=0;
  if bind(s,addr,sizeof(addr)) = socket_error then
   LastErrorToODS;
  getmem(buf,buflen);
  while not terminated do
  begin
    buf:='';
    recv_size:=recv(s,buf,buflen,0);
    if buf^ <> #0 then
      OutputDebugString(pchar(format('MSG from %s: %s',['',buf])));
  end;
end;

Zdroj. odesilatele:
procedure TForm1.Button2Click(Sender: TObject);
var s:integer;
  buf:pchar;
    recv_size:integer;
    addr:sockaddr_in;
const buflen=1000;
begin
  s:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  addr.sin_family:=AF_INET;
  addr.sin_port:=SwapEndianWord(666);
  addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
  if connect(s,addr,sizeof(addr)) = -1 then
    LastErrorToODS;
  buf:='1234';
  recv_size:=send(s,buf,5,0);
  if recv_size < 1 then
    LastErrorToODS;
end;

Vytvoreni vsech socketu probehne bez problemu.

Windows XP SP2, Delphi 6 Ent.

Jakub Cermak
ja.cermi@centrum.cz
ICQ 159971304
http://cermi.wz.cz


Odpovedá: delphi@hon.cz

6. 11. 2004 9:09

No nevim jak ostatni, ale ja mam u sve aplikace, ktera beha
na UDP komunikaci (de facto z lokalu na lokal) velke
problemy s SP2. Jinymi slovy to nefunguje a na ostatnich
WinXP SP1 ano (a u mne pred instalaci SP2 bohuzel take).
A ted co s tim.... mam sednout k Etherealu a dokazovat, ze
se ty pakety ztraci nebo prehazuji?

Jinak mam WinXP Pro SP2 s D7. Do vcerejska vsechno bezelo.

Martin.


----- Original Message -----

> Mam nekolik otazek z %sub%:
> 1. Existuje neco jako "timeoutovana" fce recv() (pro TCP spojeni)? Proste
> aby po uplynuti urcite doby skoncila i kdyz neprijdou zadna data.
> 2. Jak se pracuje s UDP sockety? Zkousel jsem poslat data z 1 UDP socketu
> na
> 2. a system hlasil odeslani ale nic se neprijalo.
> Zdroj prijemce (je to v threadu):procedure TUDPServerThread.Execute();
> var s:integer;
> addr:sockaddr_in;
> buf:pchar;
> recv_size:integer;
> const buflen=1000;
> begin
> s:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
> if s = -1 then
> LastErrorToODS; // Neco jako RaiseLastOSError, akorat nedela vyjimku a
> chybu vypise pres Output debug string
> addr.sin_family:=AF_INET;
> addr.sin_port:=SwapEndianWord(666);
> addr.sin_addr.S_addr:=0;
> if bind(s,addr,sizeof(addr)) = socket_error then
> LastErrorToODS;
> getmem(buf,buflen);
> while not terminated do
> begin
> buf:='';
> recv_size:=recv(s,buf,buflen,0);
> if buf^ <> #0 then
> OutputDebugString(pchar(format('MSG from %s: %s',['',buf])));
> end;
> end;
>
> Zdroj. odesilatele:
> procedure TForm1.Button2Click(Sender: TObject);
> var s:integer;
> buf:pchar;
> recv_size:integer;
> addr:sockaddr_in;
> const buflen=1000;
> begin
> s:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
> addr.sin_family:=AF_INET;
> addr.sin_port:=SwapEndianWord(666);
> addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
> if connect(s,addr,sizeof(addr)) = -1 then
> LastErrorToODS;
> buf:='1234';
> recv_size:=send(s,buf,5,0);
> if recv_size < 1 then
> LastErrorToODS;
> end;
>
> Vytvoreni vsech socketu probehne bez problemu.
>
> Windows XP SP2, Delphi 6 Ent.
>
> Jakub Cermak
> ja.cermi@centrum.cz
> ICQ 159971304
> http://cermi.wz.cz
>
>
>


Odpovedá: Lukas Gebauer

6. 11. 2004 12:19

> 1. Existuje neco jako "timeoutovana" fce recv() (pro TCP spojeni)? Proste
> aby po uplynuti urcite doby skoncila i kdyz neprijdou zadna data.

Primo neexistuje. Ja to delam tak, ze si pomoci Select pockam, az prijdou
nejaka data k precteni. Pak si zjistim, kolik bytu dat ceka na precteni a
tak volam Recv funkci na presne znamy pocet bytu dat, ktere jiz cekaji v
bufferech.

Diky tomu samotna Recv funkce neni nikdy blokujici a nevadi mi chybejici
timeout.

Timeout mam totiz usetreny hned v prvnim kroku, tedy pri volani Select
funkce, ktera timeout zna.

Nazorny priklad tohoto postupu najdes v kodu Synapse.


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
WEB: http://www.ararat.cz/synapse - Synapse Delphi and Kylix TCP/IP Library



Odpovedá: Lukas Gebauer

6. 11. 2004 15:32

> No nevim jak ostatni, ale ja mam u sve aplikace, ktera beha
> na UDP komunikaci (de facto z lokalu na lokal) velke
> problemy s SP2. Jinymi slovy to nefunguje a na ostatnich
> WinXP SP1 ano (a u mne pred instalaci SP2 bohuzel take).

Nepozoroval jsem zadne takoveto problemy. Schvalne jsem to pred chvili
zkusil, a skutecne vse mi funguje jak ma. Zkousel jsem jak unicasty, tak
i broadcasty. (Zkouseno Synapsi.)

Takovy hloupy napad... neblokuje ti to firewall?

--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
WEB: http://www.ararat.cz/synapse - Synapse Delphi and Kylix TCP/IP Library



Odpovedá: delphi@hon.cz

8. 11. 2004 8:41


Jasne, fw bylo prvni, co me napadlo. Nicmene, neblokuje.
Az do dneska jsem nemel s SP2 (na svem pocitaci) problemy.
Jinak znovu opakuji, co jsem uz kdysi rikal ... WinXP SP2 je
(bohuzel, protoze si myslim, ze souhrn patchu plus nektere dalsi
veci by z nej delaly pouzitelny produkt) nepouzitelny.

Martin



>> No nevim jak ostatni, ale ja mam u sve aplikace, ktera beha
>> na UDP komunikaci (de facto z lokalu na lokal) velke
>> problemy s SP2. Jinymi slovy to nefunguje a na ostatnich
>> WinXP SP1 ano (a u mne pred instalaci SP2 bohuzel take).
>
> Nepozoroval jsem zadne takoveto problemy. Schvalne jsem to pred chvili
> zkusil, a skutecne vse mi funguje jak ma. Zkousel jsem jak unicasty, tak
> i broadcasty. (Zkouseno Synapsi.)
>
> Takovy hloupy napad... neblokuje ti to firewall?


Odpovedá: Lukas Gebauer

8. 11. 2004 9:38

> Jasne, fw bylo prvni, co me napadlo. Nicmene, neblokuje.
> Az do dneska jsem nemel s SP2 (na svem pocitaci) problemy.
> Jinak znovu opakuji, co jsem uz kdysi rikal ... WinXP SP2 je
> (bohuzel, protoze si myslim, ze souhrn patchu plus nektere dalsi
> veci by z nej delaly pouzitelny produkt) nepouzitelny.

Silna slova... opakuji, osobne mam SP2 tady na vsech WinXP, coz je
tak odhadem desitka ruznych stroju, a podobny problem jsem
nezaznamenal.

Pravda, vsechny moje programy pouzivaji Synapsi. Stejne jako v
konferenci Synapse nikdo zatim nehlasil zadny podobny problem.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: delphi@hon.cz

8. 11. 2004 9:59

Zde je mozna nedorozumeni,
ja reagoval na to, ze mam s UDP prenosem na WinXP SP2
problemy, ale nerekl jsem, ze jsem to psal v Synapsi.

Jinak si za tim, co jsem napsal stojim. Jsou problemy.

Martin

----- Original Message -----
>> Jasne, fw bylo prvni, co me napadlo. Nicmene, neblokuje.
>> Az do dneska jsem nemel s SP2 (na svem pocitaci) problemy.
>> Jinak znovu opakuji, co jsem uz kdysi rikal ... WinXP SP2 je
>> (bohuzel, protoze si myslim, ze souhrn patchu plus nektere dalsi
>> veci by z nej delaly pouzitelny produkt) nepouzitelny.
>
> Silna slova... opakuji, osobne mam SP2 tady na vsech WinXP, coz je
> tak odhadem desitka ruznych stroju, a podobny problem jsem
> nezaznamenal.
>
> Pravda, vsechny moje programy pouzivaji Synapsi. Stejne jako v
> konferenci Synapse nikdo zatim nehlasil zadny podobny problem.
>


Odpovedá: Lukas Gebauer

8. 11. 2004 11:28

> Zde je mozna nedorozumeni,
> ja reagoval na to, ze mam s UDP prenosem na WinXP SP2
> problemy, ale nerekl jsem, ze jsem to psal v Synapsi.
>
> Jinak si za tim, co jsem napsal stojim. Jsou problemy.

No to je snad jedno cim, ja s UDP prenosy zadny problem nevidim. Ale
je fakt, ze na resolving jmen pouzivam na WinXP zasadne funkci
GetAddrInfo. Mozna je to tim.


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Dalibor Toman

8. 11. 2004 10:21

On Saturday, November 06, 2004 12:19 PM [CET], Lukas Gebauer
<gebylist@mlp.cz> wrote:

>> 1. Existuje neco jako "timeoutovana" fce recv() (pro TCP spojeni)?
>> Proste aby po uplynuti urcite doby skoncila i kdyz neprijdou zadna
>> data.
>
> Primo neexistuje. Ja to delam tak, ze si pomoci Select pockam, az
> prijdou nejaka data k precteni.

> Pak si zjistim, kolik bytu dat ceka
> na precteni a tak volam Recv funkci na presne znamy pocet bytu dat,
> ktere jiz cekaji v bufferech.

to je IMHO zbytecne - recv() by mela skoncit okamzite vzdy kdyz jsou v
systemovych bufferech nejaka data. Ceka se pouze pokud zadna data
nejsou

Dalibor Toman



Odpovedá: Lukas Gebauer

8. 11. 2004 10:31

> > Pak si zjistim, kolik bytu dat ceka
> > na precteni a tak volam Recv funkci na presne znamy pocet bytu dat,
> > ktere jiz cekaji v bufferech.
>
> to je IMHO zbytecne - recv() by mela skoncit okamzite vzdy kdyz jsou v
> systemovych bufferech nejaka data. Ceka se pouze pokud zadna data
> nejsou

Zbytecne to neni, pokud tuto informaci pouzijes treba i k tomu, aby
sis pripravil buffer na cteni, atd.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Dalibor Toman

8. 11. 2004 11:17

DD,

On Monday, November 08, 2004 10:31 AM [CET], Lukas Gebauer
<gebylist@mlp.cz> wrote:

>>> Pak si zjistim, kolik bytu dat ceka
>>> na precteni a tak volam Recv funkci na presne znamy pocet bytu
dat,
>>> ktere jiz cekaji v bufferech.
>>
>> to je IMHO zbytecne - recv() by mela skoncit okamzite vzdy kdyz
jsou
>> v systemovych bufferech nejaka data. Ceka se pouze pokud zadna data
>> nejsou
>
> Zbytecne to neni, pokud tuto informaci pouzijes treba i k tomu, aby
> sis pripravil buffer na cteni, atd.

ok - ale pokud nechces zbytecne ztracet rychlost mel bys mit alokovano
davno pred tim

Dalibor Toman



Odpovedá: Petr Fejfar

8. 11. 2004 11:57

Dalibor Toman wrote:

> to je IMHO zbytecne - recv() by mela skoncit okamzite vzdy kdyz jsou v
> systemovych bufferech nejaka data. Ceka se pouze pokud zadna data
> nejsou


Puvodni dotaz byl na timeout v pripade, ze netecou data - jak bys ho tedy
udelal, kdyz volani recv() bude blocking?

pf


Odpovedá: Dalibor Toman

8. 11. 2004 12:31

On Monday, November 08, 2004 11:57 AM [CET], Petr Fejfar
<development@callnet.cz> wrote:

> Dalibor Toman wrote:
>
>> to je IMHO zbytecne - recv() by mela skoncit okamzite vzdy kdyz
jsou
>> v systemovych bufferech nejaka data. Ceka se pouze pokud zadna data
>> nejsou
>
>
> Puvodni dotaz byl na timeout v pripade, ze netecou data - jak bys ho
> tedy udelal, kdyz volani recv() bude blocking?


Lukas Gebauer uz odpovedel dostatecne - staci pouzit select() a recv
volat az v pripade ze _vim_ ze jsou data ke cteni. Nepotrebuji znat
pocet bajtu, ktere cekaji k vyzvednuti (to cislo se muze kdykoliv pred
volanim recv() stejne zvysit). Staci kdyz vim, ze recv() muzu volat
bez rizika zablokovani.

Dalsi reseni je samozrejme pouzit non-blocking sockety (nechat si
posilat eventy kdyz jsou data)

Zdravi
Dalibor Toman
Fortech s.r.o.



Odpovedá: Petr Fejfar

8. 11. 2004 13:28

Dalibor Toman wrote:

> Lukas Gebauer uz odpovedel dostatecne - staci pouzit select() a recv

Jasne - ja jsem totiz tvoji namitku o zbytecnosti chybne vztahnul
k volani select a ne ke zjistovani delky pending dat  


pf


Odpovedá: delphi@hon.cz

8. 11. 2004 14:30

Navazuji na svuj predchozi prispevek.
Takze jsem na to prisel a uz mi UDP nemizi.
Problem nebyl (kupodivu) na strane SP2, ale
na strane programatora (hle, jaky div).
Takze mohu konstatovat, ze UDP chodi asi
normalne (jen ten zbytek obcas blbne).

Presto vsak tvrdim, ze v SP2 existuji chyby. Strucny
mnou nalezeny prehled predavam dal, tak jak jsem jej psal
M. Tomesovi v mailu (a hned si to i okomentuju).

* Skype prestalo chodit
[jasne, je to zadarmo, ale prece...]

* OE miva problemy s pripojenim
[a kdo je nema]

* slozka "Sitova pripojeni" se otvira neumerne dlouho
[a to ti vadi Martine? dej si neco k piti a pockej]

* DCOM aplikace (nas informacni system) funguje spatne
a nepredvidatelne
[proc nepouzivas .NET informacni system? To je ted "in"]

* MSDE, MS-SQL standard, MS-SQL Enterprise nesly nainstalovat
 na ciste WinXP Profi SP1, SP2... ale sly nainstalovat v poradi SP1, MSDE,
SP2.
[tak to udelej jak popisujes a mas klid]

* Autocad 2004 nefungoval (ne neni to ta sama chyba, kterou popisuje MS).
  Tu bych to upresnil, jedna se o nastavbu pro nabytkare.
[koho to zajima]

Martin



----- Original Message -----
> Jasne, fw bylo prvni, co me napadlo. Nicmene, neblokuje.
> Az do dneska jsem nemel s SP2 (na svem pocitaci) problemy.
> Jinak znovu opakuji, co jsem uz kdysi rikal ... WinXP SP2 je
> (bohuzel, protoze si myslim, ze souhrn patchu plus nektere dalsi
> veci by z nej delaly pouzitelny produkt) nepouzitelny.
>
> Martin
>
>
>
>>> No nevim jak ostatni, ale ja mam u sve aplikace, ktera beha
>>> na UDP komunikaci (de facto z lokalu na lokal) velke
>>> problemy s SP2. Jinymi slovy to nefunguje a na ostatnich
>>> WinXP SP1 ano (a u mne pred instalaci SP2 bohuzel take).
>>
>> Nepozoroval jsem zadne takoveto problemy. Schvalne jsem to pred chvili
>> zkusil, a skutecne vse mi funguje jak ma. Zkousel jsem jak unicasty, tak
>> i broadcasty. (Zkouseno Synapsi.)
>>
>> Takovy hloupy napad... neblokuje ti to firewall?
>
>
>
>


Odpovedá: Milan Tomes

8. 11. 2004 14:36

Ja jen dodavam sve postrehy, tak jak jsem je psal Martinovi  

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of delphi@hon.cz
> Sent: Monday, November 08, 2004 2:30 PM
>
> * Skype prestalo chodit
> [jasne, je to zadarmo, ale prece...]

Neznam - netusim

> * OE miva problemy s pripojenim
> [a kdo je nema]

OE bezne nepouzivam, uzivatele ktere znam a pouzivaji jej s nim nemaji
nejmensi problem. Pripojeni se obcas nezdari jakemukoliv klientovi (OE,
Outlook 2000, XP, 2003) bez ohledu na SP2.

> * slozka "Sitova pripojeni" se otvira neumerne dlouho
> [a to ti vadi Martine? dej si neco k piti a pockej]

Po instalaci SP2 nepozoruji zadne zpomaleni. Snad jen pokud se nepouziva
domena NT, tak to chodi velice pomalu (ale to je tusim obecny problem)

> * DCOM aplikace (nas informacni system) funguje spatne
> a nepredvidatelne
> [proc nepouzivas .NET informacni system? To je ted "in"]

Neprovozuji

> * MSDE, MS-SQL standard, MS-SQL Enterprise nesly nainstalovat
> na ciste WinXP Profi SP1, SP2... ale sly nainstalovat v poradi SP1, MSDE,
> SP2.
> [tak to udelej jak popisujes a mas klid]

Dle vlastni zkusenosti - nenastal jediny problem

> * Autocad 2004 nefungoval (ne neni to ta sama chyba, kterou popisuje MS).
> Tu bych to upresnil, jedna se o nastavbu pro nabytkare.
> [koho to zajima]

Neznam - nepouzivam  

S pozdravem

Milan Tomes


Odpovedá: Ludek ZITA

8. 11. 2004 17:40

On Behalf Of Milan Tomes
Behalf Of delphi@hon.cz

> > ........
> > * MSDE, MS-SQL standard, MS-SQL Enterprise nesly nainstalovat na
> > ciste WinXP Profi SP1, SP2... ale sly nainstalovat v poradi
> SP1, MSDE,
> > SP2. [tak to udelej jak popisujes a mas klid]
>
> Dle vlastni zkusenosti - nenastal jediny problem
>
> > * Autocad 2004 nefungoval (ne neni to ta sama chyba, kterou
> popisuje MS).
> > Tu bych to upresnil, jedna se o nastavbu pro nabytkare. [koho to
> > zajima]
> > ................

Ahoj.
K tomu vsemu snad jedine:
Kazdy komu jsem doporucil provest downgrade XP na W2k mi podekoval a
vetsina podobnych hure lokalizovatelnych problemu naprosto zmizela.
Predevsim sit zacala chodit tak jak ma.
Jak vidno XP SP2 asi moc nepomohly.
Skoda, nektere veci v XP byly uzivatelsky prijemnejsi, ale za ty
problemy to IMHO nestoji.

Ludek